package jdk.jdk8.stream;

import org.junit.Test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * 1、实例化Stream流
 * <p>
 * 为什么要要用？首先不说SQL不能实现的功能，即使SQL能够实现，但是数据库毕竟是用来[读写数据的]，主要功能是用于数据落地存储的。并不是用来做大量的逻辑处理的，所以不能为了图方便，而忽略了性能方面的损耗！
 * <p>
 * Java 8中的Stream是对集合（Collection）对象功能的增强，Collection中扩展了两个方法：stream()顺序流、parallelStream()并行流。
 * Collection是一种静态的内存数据结构，Stream是计算相关的。
 * 它专注于对集合对象进行各种非常便利、高效的聚合操作（aggregate operation），或者大批量数据操作 (bulk data operation)。
 * <p>
 * Stream API借助于同样新出现的Lambda表达式，极大的提高编程效率和程序可读性。
 * Stream关注的是对数据的运算，与CPU打交道，集合关注的是数据的存储，与内存打交道！
 * Stream不会存储元素，不会改变源对象，返回一个持有结果的stream流，操作是延迟执行的！
 * <p>
 * 执行流程：实例化stream；中间操作；终止操作
 * 注意：一个中间操作链，对数据源的数据进行处理，一旦执行终止操作，就执行中间操作链，并产生结果，之后不能被使用！！！
 *
 * @author guod
 * @version 1.0
 * @since 1.8
 */
public class StreamMain01 {
    // 顺序流 & 并行流
    @Test
    public void createType() {
        List<Integer> integers = Arrays.asList(1, 24, 8, 34, 2);
        Stream<Integer> stream = integers.stream();
        Stream<Integer> integerStream = integers.parallelStream();
    }

    // 实例方式一：通过集合创建流
    @Test
    public void create01() {
        List<Integer> asList = Arrays.asList(1, 6, 2, 4);
        Stream<Integer> stream = asList.stream();
        stream.forEach(System.out::println);
    }

    // 实例方式二：通过数组创建流
    @Test
    public void create02() {
        IntStream stream = Arrays.stream(new int[]{1, 2, 3});
    }

    // 实例方式三：通过Stream静态方法of()
    @Test
    public void create03() {
        Stream<Integer> integerStream = Stream.of(1, 23, 4, 80);
    }

    // 实例方式四：创建无限流（造数据）
    @Test
    public void create04() {
        Stream.iterate(0, t -> t + 1).limit(10).forEach(System.out::println);
        Stream.generate(Math::random).limit(10).forEach(System.out::println);
    }

    // 实例方式五：通过缓冲流
    @Test
    public void create05() throws Exception {
        BufferedReader bufferedReader = new BufferedReader(new FileReader("d:/test/test.txt"));
        Stream<String> lines = bufferedReader.lines();
        lines.forEach(System.out::println);
    }

    // 实例方式六：NIO
    @Test
    public void create06() throws Exception {
        Stream<String> linesStr = Files.lines(Paths.get("d:/test/test.txt"));
        linesStr.forEach(System.out::println);
    }

}
